package com.wjw.java.collection.generic;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型的继承和通配符：
 * 1.泛型没有继承性
 * 2.<?>：支持任意泛型
 * 3.<? extends A>：支持A类和A类的子类
 * 4.<? super A>：支持A类和A类的父类,不限于直接父类
 */
public class Generic_Extends {
    public static void main(String[] args) {
        //父类的引用指向子类对象,正确
        Object obj = new String("xx");

        //错误,泛型没有继承
        //List<Object> list = new ArrayList<String>();

        //1.
        List<String> listString = new ArrayList<>();
        listString.add("aaa");
        listString.add("BBB");
        List<Double> listDouble = new ArrayList<>();
        listDouble.add(11.11);
        listDouble.add(22.22);
        List<Object> listObject = new ArrayList<>();
        listObject.add(123);
        listObject.add(111.222);
        print1(listString);
        print1(listDouble);
        print1(listObject);

        System.out.println("------------------------------------");

        //2.
        List<AAA> listA = new ArrayList<>();
        listA.add(new AAA());
        listA.add(new AAA());
        print2(listA);

        List<BBB> listB = new ArrayList<>();
        listB.add(new BBB());
        listB.add(new BBB());
        print2(listB);

        List<CCC> listC = new ArrayList<>();
        listC.add(new CCC());
        listC.add(new CCC());
        print2(listC);

        System.out.println("------------------------------------");

        //3.
        //print3(listC); //错误
        print3(listB);
        print3(listA);
        print3(listObject);
    }

    public static void print1(List<?> list){//可以传递任意泛型类的List集合
        for (Object o : list) {
            System.out.println(o);
        }
    }

    public static void print2(List<? extends AAA> list){//可以传递AAA类及其子类
        for (Object o : list) {
            System.out.println(o);
        }
    }

    public static void print3(List<? super BBB> list){//可以传递BBB及其父类
        for (Object o : list) {
            System.out.println(o);
        }
    }

    @Test
    public void testJunit(){
        System.out.println(" 测试junit");
    }
}
//顶级父类
class AAA{

}
//子类
class BBB extends AAA{

}
//孙子类
class CCC extends BBB{

}